<!DOCTYPE html>
<html lang="en">





<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/img/apple-touch-icon.png">
  <link rel="icon" type="image/png" href="/img/favicon.png">
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#561f55">
  <meta name="description" content="">
  <meta name="author" content="Azerrroth">
  <meta name="keywords" content="">
  <title>OS Chapter 8 I/O Management ~ Codeless</title>

  <link  rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.4.1/css/bootstrap.min.css" />


  <link  rel="stylesheet" href="https://cdn.staticfile.org/github-markdown-css/4.0.0/github-markdown.min.css" />
  <link  rel="stylesheet" href="/lib/hint/hint.min.css" />

  
    <link  rel="stylesheet" href="https://cdn.staticfile.org/highlight.js/10.0.0/styles/github-gist.min.css" />
  

  


<!-- 主题依赖的图标库，不要自行修改 -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_yg9cfy8wd6.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_pjno9b9zyxs.css">


<link  rel="stylesheet" href="/css/main.css" />

<!-- 自定义样式保持在最底部 -->


  <script  src="/js/utils.js" ></script>
<meta name="generator" content="Hexo 4.2.1"></head>


<body>
  <header style="height: 70vh;">
    <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand"
       href="/">&nbsp;<strong>Codeless</strong>&nbsp;</a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/">
                <i class="iconfont icon-home-fill"></i>
                Home
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/archives/">
                <i class="iconfont icon-archive-fill"></i>
                Archives
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/categories/">
                <i class="iconfont icon-category-fill"></i>
                Categories
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/tags/">
                <i class="iconfont icon-tags-fill"></i>
                Tags
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/about/">
                <i class="iconfont icon-user-fill"></i>
                About
              </a>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" data-toggle="modal" data-target="#modalSearch">&nbsp;&nbsp;<i
                class="iconfont icon-search"></i>&nbsp;&nbsp;</a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

    <div class="view intro-2" id="background" parallax=true
         style="background: url('/img/Background/earth.jpg') no-repeat center center;
           background-size: cover;">
      <div class="full-bg-img">
        <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
          <div class="container text-center white-text fadeInUp">
            <span class="h2" id="subtitle">
              
            </span>

            
              
  <div class="mt-3 post-meta">
    <i class="iconfont icon-date-fill" aria-hidden="true"></i>
    <time datetime="2020-02-03 16:16">
      February 3, 2020 pm
    </time>
  </div>


<div class="mt-1">
  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-chart"></i>
      3.2k 字
    </span>
  

  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-clock-fill"></i>
      
      
      33
       分钟
    </span>
  

  
  
    
      <!-- 不蒜子统计文章PV -->
      <span id="busuanzi_container_page_pv" style="display: none">
        <i class="iconfont icon-eye" aria-hidden="true"></i>
        <span id="busuanzi_value_page_pv"></span> 次
      </span>
    
  
</div>

            
          </div>

          
        </div>
      </div>
    </div>
  </header>

  <main>
    
      

<div class="container-fluid">
  <div class="row">
    <div class="d-none d-lg-block col-lg-2"></div>
    <div class="col-lg-8 nopadding-md">
      <div class="container nopadding-md" id="board-ctn">
        <div class="py-5" id="board">
          <div class="post-content mx-auto" id="post">
            
            <article class="markdown-body">
              <h2 id="Principles-of-I-O-Hardware"><a href="#Principles-of-I-O-Hardware" class="headerlink" title="Principles of I/O Hardware"></a>Principles of I/O Hardware</h2><h3 id="I-O-Device"><a href="#I-O-Device" class="headerlink" title="I/O Device"></a>I/O Device</h3><p>块设备（block device）：把信息存储在固定大小的块中，每个块有自己的地址。按块寻址的。<strong>磁盘</strong>是公认块可寻址设备。<br>字符设备（character device）：以字符为单为发送or接收一个字符流，而不考虑任何块结构。字符设备不可寻址，也没有寻道操作。如：打印机、网络接口、鼠标、老鼠？？？，和大多数与磁盘不同的设备。<br>其他设备：clocks（既不是块可寻址，也不产生or接收字符流）</p>
<h3 id="Device-Controllers"><a href="#Device-Controllers" class="headerlink" title="Device Controllers"></a>Device Controllers</h3><p>I/O设备由机械部件和电子部件组成<br>机械部件<br>电子部件：称为设备控制器(device controller) or 适配器(adapter)，</p>
<ul>
<li>把串行的位流转换为字节块，并进行必要的错误校验。</li>
<li>能够处理1、2、4…个相同的设备？<h3 id="Memory-Mapped-I-O"><a href="#Memory-Mapped-I-O" class="headerlink" title="Memory-Mapped I/O"></a>Memory-Mapped I/O</h3>设备提供数据缓冲区，供操作系统or程序写入数据。<br>控制寄存器：控制数据传输</li>
</ul>
<p>I/O port：每个控制寄存器被分配一个I/O端口号，是一个8位/16位的整数。<br>I/O端口空间：所有的I/O端口形成I/O端口空间，并且受到保护使得普通用户程序不能对其访问（只有OS能访问）</p>
<p>特殊的I/O指令，例如：</p>
<blockquote>
<p>“IN REG，PORT”<br>CPU可以读取控制寄存器PORT的内容并将结果存入到CPU寄存器REG中。<br>“OUT PORT，REG”<br>CPU可以将REG的内容写入控制寄存器中</p>
</blockquote>
<p>内存地址空间和I/O地址空间映射</p>
<blockquote>
<p>“IN R0，4”读取I/O端口4的内容放入R0   (5-2a)<br>“MOV R0，4”读取内存字4的内容放入R0  (5-2b)</p>
</blockquote>
<p><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1580719931119-93788741-d69f-4f60-8329-e55b8ef27798.png#height=308&amp;width=728" srcset="/img/loading.gif" alt=""> </p>
<h4 id="内存映射-I-O"><a href="#内存映射-I-O" class="headerlink" title="内存映射 I/O"></a>内存映射 I/O</h4><p>将所有控制寄存器映射到内存空间中，每个控制寄存器被分配唯一的一个内存地址，并且不会有内存被分配这一地址。</p>
<p>优点：</p>
<ol>
<li>I/O设备驱动程序可以用C语言来写，如果不是内存映射IO，就得用汇编。</li>
<li>不需要特殊的保护机制来组织用户进程执行I/O操作</li>
<li>可以引用内存的每一条指令也可以引用控制寄存器。否则要看控制寄存器，就需要先读入CPU，再查看值。</li>
</ol>
<p>缺点：</p>
<ol>
<li>内存高速缓存给设备控制寄存器有问题，循环的时候从高速缓存中取值后不在查询设备，导致不能发现设备状态。</li>
<li>内存模块和I/O设备必须检查内存引用，看谁作出反应。<br><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1580719931327-9c4b5ef8-83ad-49a0-9995-2f3bdb86fc8e.png#height=290&amp;width=592" srcset="/img/loading.gif" alt=""></li>
</ol>
<h3 id="Interrupt"><a href="#Interrupt" class="headerlink" title="Interrupt"></a>Interrupt</h3><p>当I/O设备完成工作时，就产生一个中断。</p>
<ol>
<li>设备完成工作→通知中断控制器</li>
<li>中断控制器发出中断信号→CPU</li>
<li>CPU响应中断→中断控制器<br>中断向量：地址线上的数字被用作指向中断向量的表格的索引</li>
</ol>
<h4 id="中断-amp-陷阱"><a href="#中断-amp-陷阱" class="headerlink" title="中断 &amp; 陷阱"></a>中断 &amp; 陷阱</h4><div class="table-container">
<table>
<thead>
<tr>
<th></th>
<th>中断</th>
<th>陷阱</th>
</tr>
</thead>
<tbody>
<tr>
<td>中断原因</td>
<td>外部中断，无法预知什么时候发生</td>
<td>当前运行的软件软件主动产生的中断，要求陷入内核态</td>
</tr>
<tr>
<td>中断处理机制</td>
<td>由中断控制器响应</td>
<td>系统调用，陷入内核态</td>
</tr>
<tr>
<td>行动时间</td>
<td>程序运行中，无法预知时间</td>
<td>知道发生时间，程序预先设定</td>
</tr>
<tr>
<td>发生环境</td>
<td></td>
</tr>
</tbody>
</table>
</div>
<h4 id="精确中断-amp-不精确中断"><a href="#精确中断-amp-不精确中断" class="headerlink" title="精确中断 &amp; 不精确中断"></a>精确中断 &amp; 不精确中断</h4><p>精确中断：将机器留在一个明确状态的中断</p>
<ol>
<li>PC（程序计数器）在存在一个已知的地方</li>
<li>PC所指向的指令之前的所有指令已经完全执行</li>
<li>PC所指向的指令之后的所有指令都没有执行</li>
<li>PC所指向的指令的执行状态是已知的</li>
</ol>
<p>不精确中断：不满足上面那些要求的中断<br><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1580719931502-40024cf2-bf18-4757-bd01-644d787026fa.png#height=210&amp;width=464" srcset="/img/loading.gif" alt=""> </p>
<h2 id="Principles-of-I-O-Software"><a href="#Principles-of-I-O-Software" class="headerlink" title="Principles of I/O Software"></a>Principles of I/O Software</h2><h3 id="I-O软件的目标"><a href="#I-O软件的目标" class="headerlink" title="I/O软件的目标"></a>I/O软件的目标</h3><p>设备独立性：应该能够编写出程序：可以访问任意I/O设备而无需事先制定设备。（例如，硬盘、CD-ROM、USB无需为每一个设备独立编写程序）<br>统一命名：一个文件或一个设备的名字应该是一个简单的字符串或一个整数， 它不应依赖于设备<br>错误处理：错误应该尽可能地再接近硬件地层面得到处理<br>同步（阻塞）&amp;异步（中断驱动）传输<br>缓冲（buffering）：数据离开一个设备之后通常并不能直接存放到其最终的目的地<br>共享（shareable）设备：磁盘可以共享<br>独占（dedicated）设备：磁带机不能共享</p>
<h3 id="程序控制I-O（忙等待）"><a href="#程序控制I-O（忙等待）" class="headerlink" title="程序控制I/O（忙等待）"></a>程序控制I/O（忙等待）</h3><p>让CPU做全部工作<br>CPU把任务交给I/O设备，等待完成，等待过程需要 轮询(polling) or 忙等待(busy waiting)</p>
<h3 id="中断驱动I-O"><a href="#中断驱动I-O" class="headerlink" title="中断驱动I/O"></a>中断驱动I/O</h3><p>CPU将任务交给I/O设备后，继续运行其他进程，当I/O设备完成后发送中断请求，调用中断服务过程，CPU保存现场→响应中断→恢复现场 继续执行之前的进程。</p>
<h3 id="使用DMA的I-O"><a href="#使用DMA的I-O" class="headerlink" title="使用DMA的I/O"></a>使用DMA的I/O</h3><p>DMA控制器本质是程序控制I/O，但是由DMA控制器处理全部工作，CPU获得自由，可以在I/O期间做其他工作。<br><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1580719931707-371b7441-17f8-4d04-addc-ed2f645d74b7.png#height=222&amp;width=664" srcset="/img/loading.gif" alt=""> </p>
<h4 id="DMA-模式"><a href="#DMA-模式" class="headerlink" title="DMA 模式"></a>DMA 模式</h4><p>Burst mode：突发模式，burst只需要提供一个起始地址就行了，以后的地址依次加1，而非burst操作每次都要给出地址，以及需要中间的一些应答、等待状态等等。如果是对地址连续的读取，burst效率高得多，但如果地址是跳跃的，则无法采用burst操作<br>Fly-by mode：被传输的数据既 不通过 DMA 芯片，也不存储在 DMA 芯片中。因此，DMA 只能在 I/O 端口和内存地址间传输数据，而不是在两个I/O端口或者两块内存间。</p>
<h3 id="使用管道的I-O"><a href="#使用管道的I-O" class="headerlink" title="使用管道的I/O"></a>使用管道的I/O</h3><p>CPU干预最少的I/O操作</p>
<h3 id="磁盘读写时间决定因素"><a href="#磁盘读写时间决定因素" class="headerlink" title="磁盘读写时间决定因素"></a>磁盘读写时间决定因素</h3><ol>
<li>寻道时间：将磁盘臂移动到适当的柱面上所需的时间</li>
<li>旋转延迟：等待适当扇区旋转到磁头下所需的时间</li>
<li>实际数据传输时间</li>
</ol>
<p>对大多数磁盘，寻道时间与另外两个时间相比占主导地位，所以减少寻道时间可以充分改善系统性能<br>许多磁盘驱动程序都维护着一张表，该表按柱面号索引。每一柱面的未完成的请求组成一个链表，链表头存放在表的相应表目中。 </p>
<h2 id="I-O-Software-Layers"><a href="#I-O-Software-Layers" class="headerlink" title="I/O Software Layers"></a>I/O Software Layers</h2><p><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1580719931976-6c692b76-54a6-4ce7-95fd-d8bbe4c44233.png#height=340&amp;width=794" srcset="/img/loading.gif" alt=""> </p>
<h3 id="中断处理程序"><a href="#中断处理程序" class="headerlink" title="中断处理程序"></a>中断处理程序</h3><ol>
<li>保存没有被中断硬件保存的所有寄存器（包括PSW）。、</li>
<li>为中断服务过程设置上下文，可能包括设置TLB、MMU和页表。</li>
<li>为中断服务过程设置堆栈</li>
<li>应答中断控制器，如果不存在集中的中断控制器，则再次开放中断。</li>
<li>将寄存器从它们被保存的地方（可能是某个堆栈）复制到进程表中。</li>
<li>运行中断服务过程，从发出中断的设备控制器的寄存器中提取信息。</li>
<li>选择下一次运行哪个进程，如果中断导致某个被阻塞的高优先级进程变为就绪，则可能选择它现在就运行</li>
<li>为下一次要运行的进程设置MMU上下文，也许还需要设置某个 TLB。</li>
<li>装入新进程的寄存器，包括其PSW。</li>
<li>开始运行新进程</li>
</ol>
<h3 id="设备响应程序（就是设备驱动）"><a href="#设备响应程序（就是设备驱动）" class="headerlink" title="设备响应程序（就是设备驱动）"></a>设备响应程序（就是设备驱动）</h3><p>设备相应程序：每个连接到计算机上的I/O设备都需要某些设备特定的代码来对其进行控制。这样的代码称为设备驱动程序。</p>
<p>每个I/O设备关联一个计算机需要一个特定的设备响应程序<br>每个设备驱动一般只能处理一种设备，最多是一类相似的设备<br>为了响应硬件设备（控制寄存器），设备驱动通常都需要进入内核态</p>
<h3 id="与设备无关的I-O软件"><a href="#与设备无关的I-O软件" class="headerlink" title="与设备无关的I/O软件"></a>与设备无关的I/O软件</h3><p><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1580719932155-4836f60b-3cea-4a0c-8b7f-8f92151ebebf.png#height=208&amp;width=528" srcset="/img/loading.gif" alt=""> </p>
<h4 id="设备驱动程序的统一接口"><a href="#设备驱动程序的统一接口" class="headerlink" title="设备驱动程序的统一接口"></a>设备驱动程序的统一接口</h4><p><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1580719932399-911249cf-6089-411c-8db9-d2888fa4889d.png#height=366&amp;width=698" srcset="/img/loading.gif" alt=""> </p>
<ul>
<li>没有标准驱动的程序接口：需要大量全新的编程工作，为每个设备编写驱动程序。</li>
<li>有标准的驱动程序接口：只需要直到驱动程序接口什么亚子，就很轻松容易。</li>
</ul>
<h4 id="缓冲"><a href="#缓冲" class="headerlink" title="缓冲"></a>缓冲</h4><p><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1580719932661-e6a0206e-cd19-4525-b823-876d34701d0b.png#height=356&amp;width=672" srcset="/img/loading.gif" alt=""> </p>
<ol>
<li>没缓冲：对于每个到来的字符，都必须启动用户进程</li>
<li>用户缓冲：放入缓冲区直到字符填满。（如果缓冲区被分页调出内存，就把缓冲区锁定在内存中，可能会下降系统性能）</li>
<li>内核空间缓冲复制到用户空间：一个不够就来俩</li>
<li>双缓冲：一个满了放另一个，一个复制给用户缓冲。另一个满了这一个复制完了也清空了。</li>
<li>循环缓冲区：一个指针指向下一个空闲的字，另一个指针指向缓冲区数据第一个字。</li>
</ol>
<h4 id="错误报告"><a href="#错误报告" class="headerlink" title="错误报告"></a>错误报告</h4><p>错误在I/O环境中更为常见<br>I/O错误类型</p>
<ul>
<li>编程错误：只是将一个错误代码报告返回给调用者</li>
<li>实际I/O错误：由驱动程序决定做什么，驱动不知道就向上传递</li>
</ul>
<h4 id="与设备无关的块大小"><a href="#与设备无关的块大小" class="headerlink" title="与设备无关的块大小"></a>与设备无关的块大小</h4><p>不同磁盘有不同的扇区大小<br>与设备无关快重组一个逻辑块映射提供给更高层，而与物理块无关</p>
<h3 id="用户空间I-O软件"><a href="#用户空间I-O软件" class="headerlink" title="用户空间I/O软件"></a>用户空间I/O软件</h3><h2 id="Disks"><a href="#Disks" class="headerlink" title="Disks"></a>Disks</h2><h3 id="硬件"><a href="#硬件" class="headerlink" title="硬件"></a>硬件</h3><h4 id="磁盘"><a href="#磁盘" class="headerlink" title="磁盘"></a>磁盘</h4><p>磁盘被组织成柱面，每个柱面包含若干磁道，磁道与垂直堆叠的磁头个数相同<br>磁道被分成若干扇区<br>重叠寻道：控制器可以同时控制两个或多个驱动器进行寻道<br>逻辑地址：(x, y, z)<br>x个柱面；y个磁头；每个磁道z个扇区<br>$磁盘容量 = 磁头数 × 柱面数 × 每道扇区数 × 每扇区字节数$</p>
<h4 id="RAID"><a href="#RAID" class="headerlink" title="RAID"></a>RAID</h4><p><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1580719933152-c9a8e00f-5591-4510-bb5d-2e8a28ba91a0.png#height=988&amp;width=786" srcset="/img/loading.gif" alt=""> </p>
<h4 id="CD-ROM"><a href="#CD-ROM" class="headerlink" title="CD-ROM"></a>CD-ROM</h4><h3 id="磁盘臂调度算法"><a href="#磁盘臂调度算法" class="headerlink" title="磁盘臂调度算法"></a>磁盘臂调度算法</h3><h4 id="磁盘读写时间决定因素-1"><a href="#磁盘读写时间决定因素-1" class="headerlink" title="磁盘读写时间决定因素"></a>磁盘读写时间决定因素</h4><ol>
<li><strong>寻道时间</strong>：将磁盘臂移动到适当的柱面上所需的时间</li>
<li>旋转延迟：等待适当扇区旋转到磁头下所需的时间</li>
<li><strong>实际数据传输时间</strong></li>
</ol>
<p>对大多数磁盘，<strong>寻道时间</strong>与另外两个时间相比占主导地位，所以减少寻道时间可以充分改善系统性能<br>许多磁盘驱动程序都维护着一张表，该表按柱面号索引。每一柱面的未完成的请求组成一个链 表，链表头存放在表的相应表目中。 </p>
<h4 id="先来先服务-FCFS"><a href="#先来先服务-FCFS" class="headerlink" title="先来先服务 FCFS"></a>先来先服务 FCFS</h4><p>很难优化寻道时间</p>
<h4 id="最短寻道优先（SSF）"><a href="#最短寻道优先（SSF）" class="headerlink" title="最短寻道优先（SSF）"></a>最短寻道优先（SSF）</h4><p><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1580719933449-4dba055f-8270-4bc5-9019-ae4f916c4b68.png#height=318&amp;width=816" srcset="/img/loading.gif" alt=""><br>移动了61个柱面</p>
<p>下一次总是处理与磁头距离最近的请求以使寻道时间最小化<br>不断有其他请求到达，那么磁盘更容易停留在中部区域，</p>
<h4 id="电梯算法（elevator-algorithm）"><a href="#电梯算法（elevator-algorithm）" class="headerlink" title="电梯算法（elevator algorithm）"></a>电梯算法（elevator algorithm）</h4><p>维护一个二进制位：UP 或者 DOWN<br>当一个请求处理完成后，磁盘or电梯 驱动检查位，如果是UP，就移到下一个更高的未完成的请求。如果更高位置没有未完成请求，方向位取反，变为DOWN，同时存在一个地位置请求，就移向该位置。<br><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1580719933725-4677005f-11bc-410f-a130-7f77e3609172.png#height=360&amp;width=822" srcset="/img/loading.gif" alt=""><br>移动了60个柱面</p>
<h2 id="Clocks"><a href="#Clocks" class="headerlink" title="Clocks"></a>Clocks</h2><h2 id="User-Interfaces"><a href="#User-Interfaces" class="headerlink" title="User Interfaces"></a>User Interfaces</h2><h2 id="Power-Management"><a href="#Power-Management" class="headerlink" title="Power Management"></a>Power Management</h2><h2 id="假脱机技术"><a href="#假脱机技术" class="headerlink" title="假脱机技术"></a>假脱机技术</h2><h3 id="脱机技术"><a href="#脱机技术" class="headerlink" title="脱机技术"></a>脱机技术</h3><p>脱离主机的控制进行的I/O操作（使用外围控制机实现的）</p>
<p>缓解了CPU与慢速I/O设备的速度矛盾<br>即使CPU忙碌，也可以提前将数据输入到磁带（比外围设备快一点的设备）；即使慢速输出设备忙碌，也可以提前将数据输出到磁带（比慢速输出设备快的设备）</p>
<h3 id="假脱机技术——输入井、输出井"><a href="#假脱机技术——输入井、输出井" class="headerlink" title="假脱机技术——输入井、输出井"></a>假脱机技术——输入井、输出井</h3><ul>
<li>假脱机技术，SPOOLing技术，使用软件的方式模拟脱机技术。</li>
<li>输入井：模拟脱机输入时候的磁带，用于收容I/O设备输入的数据</li>
<li>输出井：模拟脱机输出时候的磁带，收容用户进程输出的数据</li>
<li>输入进程：模拟脱机输入时候的外围控制机</li>
<li>输出进程：模拟脱机输出时候的外围控制机</li>
</ul>
<p>在磁盘上开辟两个存储区域“<strong>输入井、输出井</strong>”<br><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1580719933992-d459bc77-1896-4679-8db6-e6d37de47bf5.png#height=376&amp;width=886" srcset="/img/loading.gif" alt=""> </p>
<h3 id="假脱机应用"><a href="#假脱机应用" class="headerlink" title="假脱机应用"></a>假脱机应用</h3><p>独占是设备<br>共享设备：允许多个进程“同时”使用的设备<br>SPOOLing能把独占式设备（打印机）改装成共享设备。<br>SPOOLing能把一台物理设备 虚拟成 逻辑上的多台设备</p>

            </article>
            <hr>
            <div>
              <div class="post-metas mb-3">
                
                  <div class="post-meta mr-3">
                    <i class="iconfont icon-category"></i>
                    
                      <a class="hover-with-bg" href="/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-Operating-System/">操作系统(Operating System)</a>
                    
                  </div>
                
                
                  <div class="post-meta">
                    <i class="iconfont icon-tags"></i>
                    
                      <a class="hover-with-bg" href="/tags/Operating-System/">Operating System</a>
                    
                  </div>
                
              </div>
              
                <p class="note note-warning">本博客所有文章除特别声明外，均采用 <a href="https://zh.wikipedia.org/wiki/Wikipedia:CC_BY-SA_3.0%E5%8D%8F%E8%AE%AE%E6%96%87%E6%9C%AC" target="_blank" rel="nofollow noopener noopener">CC BY-SA 3.0协议</a> 。转载请注明出处！</p>
              
              
                <div class="post-prevnext row">
                  <div class="post-prev col-6">
                    
                    
                      <a href="/2020/04/26/csgo-server/">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">Cent OS 搭建CS:GO 服务器</span>
                        <span class="visible-mobile">Previous</span>
                      </a>
                    
                  </div>
                  <div class="post-next col-6">
                    
                    
                      <a href="/2020/02/03/OS-Chapter-7-Memory-Management/">
                        <span class="hidden-mobile">OS Chapter 7 Memory Management</span>
                        <span class="visible-mobile">Next</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </div>
                </div>
              
            </div>

            
              <!-- Comments -->
              <div class="comments" id="comments">
                
                
  <script type="text/javascript">
    function loadUtterances() {
      var s = document.createElement('script');
      s.setAttribute('src', 'https://utteranc.es/client.js');
      s.defer = false
      s.setAttribute('repo', 'Azerrroth/comments-utterances');
      s.setAttribute('issue-term', 'pathname');
      
      s.setAttribute('theme', 'github-light');
      s.setAttribute('crossorigin', 'anonymous');
      var e = document.getElementsByTagName('script')[0];
      e.parentNode.insertBefore(s, e);
    }
    createObserver(loadUtterances, 'comments')
  </script>


              </div>
            
          </div>
        </div>
      </div>
    </div>
    
      <div class="d-none d-lg-block col-lg-2 toc-container" id="toc-ctn">
        <div id="toc">
  <p class="toc-header"><i class="iconfont icon-list"></i>&nbsp;TOC</p>
  <div id="tocbot"></div>
</div>

      </div>
    
  </div>
</div>

<!-- Custom -->


    
  </main>

  
    <a id="scroll-top-button" href="#" role="button">
      <i class="iconfont icon-arrowup" aria-hidden="true"></i>
    </a>
  

  
    <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">Search</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v"
                 for="local-search-input">keyword</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>
  

  

  

  <footer class="mt-5">
  <div class="text-center py-3">
    <div>
      <a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a>
      <i class="iconfont icon-love"></i>
      <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener">
        <span>Fluid</span></a>
    </div>
    
  <div class="statistics">
    
    

    
      
        <!-- 不蒜子统计PV -->
        <span id="busuanzi_container_site_pv" style="display: none">
            总访问量 
            <span id="busuanzi_value_site_pv"></span>
             次
          </span>
      
      
        <!-- 不蒜子统计UV -->
        <span id="busuanzi_container_site_uv" style="display: none">
            总访客数 
            <span id="busuanzi_value_site_uv"></span>
             人
          </span>
      
    
  </div>


    

    
  </div>
</footer>

<!-- SCRIPTS -->
<script  src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js" ></script>
<script  src="https://cdn.staticfile.org/twitter-bootstrap/4.4.1/js/bootstrap.min.js" ></script>
<script  src="/js/debouncer.js" ></script>
<script  src="/js/main.js" ></script>

<!-- Plugins -->


  
    <script  src="/js/lazyload.js" ></script>
  



  <script defer src="https://cdn.staticfile.org/clipboard.js/2.0.6/clipboard.min.js" ></script>
  <script  src="/js/clipboard-use.js" ></script>



  <script defer src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" ></script>





  <script  src="https://cdn.staticfile.org/tocbot/4.11.1/tocbot.min.js" ></script>
  <script>
    $(document).ready(function () {
      var boardCtn = $('#board-ctn');
      var boardTop = boardCtn.offset().top;

      tocbot.init({
        tocSelector: '#tocbot',
        contentSelector: 'article.markdown-body',
        headingSelector: 'h1,h2,h3,h4,h5,h6',
        linkClass: 'tocbot-link',
        activeLinkClass: 'tocbot-active-link',
        listClass: 'tocbot-list',
        isCollapsedClass: 'tocbot-is-collapsed',
        collapsibleClass: 'tocbot-is-collapsible',
        collapseDepth: 0,
        scrollSmooth: true,
        headingsOffset: -boardTop
      });
      if ($('.toc-list-item').length > 0) {
        $('#toc').css('visibility', 'visible');
      }
    });
  </script>



  <script  src="https://cdn.staticfile.org/typed.js/2.0.11/typed.min.js" ></script>
  <script>
    var typed = new Typed('#subtitle', {
      strings: [
        '  ',
        "OS Chapter 8 I/O Management&nbsp;",
      ],
      cursorChar: "_",
      typeSpeed: 70,
      loop: false,
    });
    typed.stop();
    $(document).ready(function () {
      $(".typed-cursor").addClass("h2");
      typed.start();
    });
  </script>



  <script  src="https://cdn.staticfile.org/anchor-js/4.2.2/anchor.min.js" ></script>
  <script>
    anchors.options = {
      placement: "right",
      visible: "false",
      
    };
    var el = "h1,h2,h3,h4,h5,h6".split(",");
    var res = [];
    for (item of el) {
      res.push(".markdown-body > " + item)
    }
    anchors.add(res.join(", "))
  </script>



  <script  src="/js/local-search.js" ></script>
  <script>
    var path = "/local-search.xml";
    var inputArea = document.querySelector("#local-search-input");
    inputArea.onclick = function () {
      searchFunc(path, 'local-search-input', 'local-search-result');
      this.onclick = null
    }
  </script>



  <script  src="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.js" ></script>
  <link  rel="stylesheet" href="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.css" />

  <script>
    $('#post img:not(.no-zoom img, img[no-zoom]), img[zoom]').each(
      function () {
        var element = document.createElement('a');
        $(element).attr('data-fancybox', 'images');
        $(element).attr('href', $(this).attr('src'));
        $(this).wrap(element);
      }
    );
  </script>





  

  
    <!-- MathJax -->
    <script>
      MathJax = {
        tex: {
          inlineMath: [['$', '$'], ['\\(', '\\)']]
        },
        options: {
          renderActions: {
            findScript: [10, doc => {
              document.querySelectorAll('script[type^="math/tex"]').forEach(node => {
                const display = !!node.type.match(/; *mode=display/);
                const math = new doc.options.MathItem(node.textContent, doc.inputJax[0], display);
                const text = document.createTextNode('');
                node.parentNode.replaceChild(text, node);
                math.start = { node: text, delim: '', n: 0 };
                math.end = { node: text, delim: '', n: 0 };
                doc.math.push(math);
              });
            }, '', false],
            insertedScript: [200, () => {
              document.querySelectorAll('mjx-container').forEach(node => {
                let target = node.parentNode;
                if (target.nodeName.toLowerCase() === 'li') {
                  target.parentNode.classList.add('has-jax');
                }
              });
            }, '', false]
          }
        }
      };
    </script>

    <script async src="https://cdn.staticfile.org/mathjax/3.0.5/es5/tex-svg.js" ></script>

  













  

  

  

  

  

  





</body>
</html>
